package com.feicheng.house.service.impl;

import com.feicheng.house.entity.Role;

import com.feicheng.house.mapper.RoleMapper;
import com.feicheng.house.service.IRoleService;
import com.feicheng.house.entity.RolePermission;
import com.feicheng.house.entity.User;
import com.feicheng.house.exception.SystemException;
import com.feicheng.house.result.ResultInfo;
import com.feicheng.house.service.IRolePermissionService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author feichengTech
 * @since 2021-10-30
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {

	@Autowired
	IRolePermissionService rolePermissionService;

	@Autowired
	HttpSession session;
	
	@Autowired
	RoleMapper roleMapper;
	

	@Override
	public ResultInfo deleteRole(Integer roleId) {


		QueryWrapper<RolePermission> rpWrapper = new QueryWrapper<RolePermission>();
		rpWrapper.eq("role_id", roleId);
		//删除与permission的关联
		//パーミッションの関連付けを解除する
		rolePermissionService.remove(rpWrapper);
		this.removeById(roleId);
		return ResultInfo.success();
	}

	@Override
	public ResultInfo addRole(Role role, String permissions) {


		// 在session中获取userId
		//セッションオブジェクトからユーザーIDを取得する
		JSONObject current = (JSONObject) session.getAttribute("CURRENT");
		int currentUserId = 0;
		if (current != null) {
			User currentUser = (User) current.get("user");
			currentUserId = currentUser.getUserId();
		}

		role.setCu(currentUserId);
		role.setUu(currentUserId);
		role.setCt(LocalDateTime.now());
		role.setUt(LocalDateTime.now());
		role.setStatu(true);
		
		
		this.save(role);
		//被添加permission的role对象必须要有ID
		//パーミッションが追加されたロールプロジェクトには、IDが必要
		if (null == role.getRoleId()) {
			throw new SystemException("新增失败");
		}

		if (JSONArray.isValidArray(permissions)) {
			JSONArray permissionIds = JSON.parseArray(permissions);
			if (!permissionIds.isEmpty()) {
				QueryWrapper<RolePermission> rpWrapper = new QueryWrapper<RolePermission>();
				rpWrapper.eq("role_id", role.getRoleId());
				//删除其与所有的权限的关联
				//パーミッションとの関連付けを解除する
				rolePermissionService.remove(rpWrapper);
				//RolePermission对象被存放在batchList中，将来批量存入到数据库
				//RolePermissionプロジェクトはbatchList保存され、将来的にはバッチでデータベースに保存されます。
				List<RolePermission> batchList = new ArrayList<RolePermission>();
				for (Object permissionId : permissionIds) {
					RolePermission rm = new RolePermission();
					rm.setRoleId(role.getRoleId());
					rm.setPermissionId((Integer) permissionId);
					batchList.add(rm);
				}
				rolePermissionService.saveBatch(batchList);
			}
		}

		return ResultInfo.success();
	}

	@Override
	public ResultInfo updateRole(Role role, String permissions) {


		//更新Role表中的内容
		//ロールテーブルの内容を更新する
		this.updateById(role);
		if (JSONArray.isValidArray(permissions)) {

			JSONArray permissionIds = JSON.parseArray(permissions);
			if (!permissionIds.isEmpty()) {
				QueryWrapper<RolePermission> rpWrapper = new QueryWrapper<RolePermission>();
				//删除原先与permission的关联
				//パーミッションとの関連付けを解除する
				rolePermissionService.remove(rpWrapper);
				//添加新的关联
				//新しいの関連付けを追加する
				List<RolePermission> batchList = new ArrayList<RolePermission>();
				for (Object permissionId : permissionIds) {
					RolePermission rm = new RolePermission();
					rm.setRoleId(role.getRoleId());
					rm.setPermissionId((Integer) permissionId);
					batchList.add(rm);
				}
				rolePermissionService.saveBatch(batchList);
			}
		}

		return ResultInfo.success();
	}
	

	@Override
	public ResultInfo getRoleById(Integer roleId) {

		
		Role role = this.getById(roleId);
		
		if (null == role) {
			throw new SystemException("角色找不到");
		}
		
		JSONObject result = new JSONObject();
		result.put("role", role);
		QueryWrapper<RolePermission> rpWrapper = new QueryWrapper<RolePermission>();
		rpWrapper.eq("role_id", roleId);
		//用上面的QueryWrapper将关联的permissionId也作为结果的一部分去返回
		//生成されたばかりのQueryWrapperを使用して、結果の一部として関連するパーミッションを返す
		List<RolePermission> rpList = rolePermissionService.list(rpWrapper);
		if (null != rpList && !rpList.isEmpty()) {
			List<Integer> permissionIds = new ArrayList<Integer>();
			for (RolePermission rp : rpList) {
				permissionIds.add(rp.getPermissionId());
			}
			result.put("permissions", permissionIds);
			
		}
		
		return ResultInfo.success(result);
	}
	
	@Override
	public ResultInfo all() {
		QueryWrapper<Role> roleQueryWapper = new QueryWrapper<Role>();
		roleQueryWapper.eq("statu", true);
		return ResultInfo.success(this.list(roleQueryWapper));
	}
	

	@Override
	public ResultInfo list(
			String roleName,
			Boolean status,
			Integer currentPage,
			Integer pageSize
			) {
		QueryWrapper<Role> roleQueryWapper = new QueryWrapper<Role>();
		
		if (StringUtils.hasLength(roleName)) {
			roleQueryWapper.like("role_name", roleName);
		}
		
		if (status != null) {
			roleQueryWapper.eq("statu", status);
		}
		
		IPage<Role> pageInfo = new Page<Role>(currentPage, pageSize);
		return ResultInfo.success(this.page(pageInfo, roleQueryWapper));
	}
}
